package cn.edu.ctbu.web.restcontroller;

import cn.edu.ctbu.web.dao.TeacherCourse;
import cn.edu.ctbu.web.dao.TeacherGrade;
import cn.edu.ctbu.web.domain.Teacher;
import cn.edu.ctbu.web.helper.PageUtils;
import cn.edu.ctbu.web.helper.R;
import cn.edu.ctbu.web.service.TeacherService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Slf4j
@RestController
@RequestMapping(value = "/webapi/teacher")
public class TeacherRestController {
    @Autowired
    TeacherService teacherService;

    /**
     * 使用教师编号查询个人信息
     * @param no 教师编号
     * @return 教师个人信息
     */
    @GetMapping(value = "/get/{no}")
    public Teacher getTeacher(@PathVariable("no") String no) {
        return teacherService.findByNo(no);
    }

    /**
     * 使用教师编号查询授课信息
     * @param no 教师编号
     * @param pageNum 当前页码
     * @param pageSize 每一页的记录数
     * @return 分页结果
     */
    @GetMapping(value="/getallcourse/{no}")
    public PageUtils getAllCourse(@PathVariable String no, @RequestParam(defaultValue = "1") int pageNum, @RequestParam(defaultValue = "3") int pageSize) {

        // 创建 Pageable 对象
        Pageable pageable = PageRequest.of(pageNum - 1, pageSize);

        // 调用服务层方法获取分页数据
        Page<TeacherCourse> coursePage = teacherService.findCourseByNoTeacher(no, pageable);

        // 使用 PageUtils 封装结果
        return PageUtils.builder()
                .total(coursePage.getTotalElements())
                .rows(coursePage.getContent())
                .build();
    }

    /**
     * 使用教师编号查询授课课程学生成绩信息
     * @param no 教师编号
     * @param pageNum 当前页码
     * @param pageSize 每一页的记录数
     * @return 分页结果
     */
    @GetMapping(value="/getallgrade/{no}")
    public PageUtils getAllGrade(@PathVariable String no, @RequestParam(defaultValue = "1") int pageNum, @RequestParam(defaultValue = "3") int pageSize) {

        // 创建 Pageable 对象
        Pageable pageable = PageRequest.of(pageNum - 1, pageSize);

        // 调用服务层方法获取分页数据
        Page<TeacherGrade> gradePage = teacherService.findGradeByNoTeacher(no, pageable);

        // 使用 PageUtils 封装结果
        return PageUtils.builder()
                .total(gradePage.getTotalElements())
                .rows(gradePage.getContent())
                .build();
    }

    /**
     * Teacher 增、删、改、查
     * {操作名}{操作对象}{使用层}
     **/

    /**
     * 根据课程编号、学生编号和学生成绩，新增成绩表的信息
     * @param cno 课程编号
     * @param sno 学生学号
     * @param grade 课程成绩
     */
    @PostMapping(value = "/insertGrade/{cno}&{sno}&{grade}")
    public R insertGradeTeacher(@PathVariable String cno, @PathVariable String sno, @PathVariable int grade) throws Exception{
        teacherService.insertGradeTeacher(cno, sno, grade);
        return R.ok();
    }

    /**
     * 根据课程编号和学生学号删除该课程学生信息
     * @param cno 课程编号
     * @param sno 学生学号
     */
    @DeleteMapping(value = "/deleteGrade/{cno}&{sno}")
    public R deleteGradeTeacher(@PathVariable String cno, @PathVariable String sno) throws Exception{
        teacherService.deleteGradeTeacher(cno, sno);
        return R.ok();
    }

    /**
     * 根据课程编号、学生学号和学生成绩，更改成绩表的信息
     * @param cno 课程编号
     * @param sno 学生学号
     * @param grade 课程成绩
     */
    @PostMapping(value = "/updateGrade/{cno}&{sno}&{grade}")
    public R updateGradeTeacher(@PathVariable("cno") String cno, @PathVariable("sno") String sno, @PathVariable("grade") int grade) throws Exception{
        teacherService.updateGradeTeacher(cno, sno, grade);
        return R.ok();
    }

    /**
     * 根据课程编号查询该课程所有学生的成绩
     * @param cno 课程编号
     * @param pageNum 当前页码
     * @param pageSize 每一页的记录数
     * @return 分页结果
     */
    @GetMapping(value="/searchGrade/{cno}")
    public PageUtils searchGradeTeacher(@PathVariable String cno, @RequestParam(defaultValue = "1") int pageNum, @RequestParam(defaultValue = "3") int pageSize) {

        // 创建 Pageable 对象
        Pageable pageable = PageRequest.of(pageNum - 1, pageSize);

        // 调用服务层方法获取分页数据
        Page<TeacherGrade> gradePage = teacherService.searchGradeTeacher(cno, pageable);

        // 使用 PageUtils 封装结果
        return PageUtils.builder()
                .total(gradePage.getTotalElements())
                .rows(gradePage.getContent())
                .build();
    }

    /**
     * 根据Teacher新增学生信息
     * @param teacher 学生对象
     */
    @PostMapping(value = "/insertTeacher")
    public R insertTeacher(Teacher teacher) throws Exception{
        teacherService.insert(teacher);
        return R.ok();
    }

    /**
     * 根据姓名查询学生信息
     * url: /webapi/teacher/getbyname/{name}
     * @param name 学生姓名
     * @return pageUtils
     */
    @GetMapping(value = "/getbyname/{name}")
    public PageUtils findByName(Integer pageSize, Integer pageNum, @PathVariable String name) {
        Pageable pageable = PageRequest.of(pageNum-1, pageSize);
        Page<Teacher> tempTeachers = teacherService.findByName(name, pageable);
        PageUtils pageUtils = new PageUtils(tempTeachers.getTotalElements(),tempTeachers.getContent());
        return  pageUtils;
    }

    /**
     * 根据学号查询学生信息
     * url：/webapi/teacher/getbyno/{no}
     * @param no 学生学号
     * @return pageUtils
     */
    @GetMapping(value = "/getbyno/{no}")
    public PageUtils findByNo(Integer pageSize, Integer pageNum, @PathVariable String no){
        Pageable pageable = PageRequest.of(pageNum-1, pageSize);
        Page<Teacher> tempTeachers = teacherService.findByNo(no, pageable);
        PageUtils pageUtils = new PageUtils(tempTeachers.getTotalElements(),tempTeachers.getContent());
        return  pageUtils;
    }

    /**
     * 根据id查询学生信息
     * url：/webapi/teacher/getbyid/{id}
     * @param id 学生id
     * @return pageUtils
     */
    @GetMapping(value = "/getbyid/{id}")
    public PageUtils findById(Integer pageSize, Integer pageNum, @PathVariable Integer id){
        Pageable pageable = PageRequest.of(pageNum-1, pageSize);
        Page<Teacher> tempTeachers = teacherService.findById(id, pageable);
        PageUtils pageUtils = new PageUtils(tempTeachers.getTotalElements(),tempTeachers.getContent());
        return  pageUtils;
    }
    
    /**
     * 根据教师编号获取教师授课课程信息
     * @param tno 教师编程
     * @return 授课课程信息
     */
    @GetMapping(value = "/getCourse/{tno}")
    public List<TeacherCourse> findCourseByTno(@PathVariable String tno){
        return teacherService.findCourseByTno(tno);
    }


    /**
     * 删除学生信息 对应/webapi/teacher/delete
     * @param id 学生id
     */
    @DeleteMapping("/delete/{id}")
    public R delete(@PathVariable Integer id) throws Exception{
        Teacher teacher = teacherService.findById(id);
        teacherService.delete(teacher);
        return R.ok();
    }

    /**
     * 获取要编辑的学生信息
     * url：/webapi/teacher/get/id
     * @param id 学生id
     * @return Teacher
     */
    @GetMapping(value = "/getinfo/{id}")
    public Teacher get(@PathVariable Integer id){
        Teacher teacher = teacherService.findById(id);
        teacher.setPassword("");
        return teacher;
    }

    /**
     * 更新学生信息
     * url: /webapi/teacher/update
     * @param teacher 学生对象，包含学生信息
     * @return teacherService.update(Teacher)
     */
    @PostMapping("/update")
    public Teacher update(Teacher teacher) {
        // 读取旧的教师信息
        Teacher oldTeacher = teacherService.findById(teacher.getId());
        // 如果没有设置新的密码，就继续用原来的密码
        if (StringUtils.isEmpty(teacher.getPassword())){
            teacher.setPassword(oldTeacher.getPassword());
        }
        // 更新教师信息
        return teacherService.update(teacher);
    }
}
